package com.ruc.dbiir.rest.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.commons.lang.StringUtils;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

/**
 * remote linux shell exe
* author：mark   
* createTime：Aug 30, 2018 8:07:12 AM   
* @version
 */
public class RemoteExecuteCommand 
{

	//字符编码默认是utf-8  
	private static String  DEFAULTCHART="UTF-8";  
	private Connection conn;  
	private String ip;  
	private String userName;  
	private String userPwd;  

	public RemoteExecuteCommand(String ip, String userName, String userPwd) {  
		this.ip = ip;  
		this.userName = userName;  
		this.userPwd = userPwd;  
	}  


	public RemoteExecuteCommand() {  

	}  

	/** 
	 * 远程登录linux的主机 
	 * @author Ickes 
	 * @since  V0.1 
	 * @return 
	 *      登录成功返回true，否则返回false 
	 */  
	public Boolean login(){  
		boolean flg=false;  
		try {  
			conn = new Connection(ip);  
			conn.connect();//连接  
			flg=conn.authenticateWithPassword(userName, userPwd);//认证  
		} catch (IOException e) {  
			e.printStackTrace();  
		}  
		return flg;  
	}  
	/** 
	 * @author Ickes 
	 * 远程执行shll脚本或者命令 
	 * @param cmd 
	 *      即将执行的命令 
	 * @return 
	 *      命令执行完后返回的结果值 
	 * @since V0.1 
	 */  
	public String execute(String cmd){  
		String result="";  
		try {  
			if(login()){  
				Session session= conn.openSession();//打开一个会话  
				session.execCommand(cmd);//执行命令  
				result=processStdout(session.getStdout(),DEFAULTCHART);  
				//如果为得到标准输出为空，说明脚本执行出错了  
				if(StringUtils.isBlank(result)){  
					result=processStdout(session.getStderr(),DEFAULTCHART);  
				}  
				conn.close();  
				session.close();  
			}  
		} catch (IOException e) {  
			e.printStackTrace();  
		}  
		return result;  
	}  


	/** 
	 * @author Ickes 
	 * 远程执行shll脚本或者命令 
	 * @param cmd 
	 *      即将执行的命令 
	 * @return 
	 *      命令执行成功后返回的结果值，如果命令执行失败，返回空字符串，不是null 
	 * @since V0.1 
	 */  
	public String executeSuccess(String cmd){  
		String result="";  
		try {  
			if(login()){  
				Session session= conn.openSession();//打开一个会话  
				session.execCommand(cmd);//执行命令  
				result=processStdout(session.getStdout(),DEFAULTCHART);  
				conn.close();  
				session.close();  
			}  
		} catch (IOException e) {  
			e.printStackTrace();  
		}  
		return result;  
	}  

	/** 
	 * 解析脚本执行返回的结果集 
	 * @author Ickes 
	 * @param in 输入流对象 
	 * @param charset 编码 
	 * @since V0.1 
	 * @return 
	 *       以纯文本的格式返回 
	 */  
	private String processStdout(InputStream in, String charset){  
		InputStream    stdout = new StreamGobbler(in);  
		StringBuffer buffer = new StringBuffer();;  
		try {  
			BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset));  
			String line=null;  
			while((line=br.readLine()) != null){  
				buffer.append(line+"\n");  
			}  
		} catch (UnsupportedEncodingException e) {  
			e.printStackTrace();  
		} catch (IOException e) {  
			e.printStackTrace();  
		}  
		return buffer.toString();  
	}  

	public static void setCharset(String charset) {  
		DEFAULTCHART = charset;  
	}  
	public Connection getConn() {  
		return conn;  
	}  
	public void setConn(Connection conn) {  
		this.conn = conn;  
	}  
	public String getIp() {  
		return ip;  
	}  
	public void setIp(String ip) {  
		this.ip = ip;  
	}  
	public String getUserName() {  
		return userName;  
	}  
	public void setUserName(String userName) {  
		this.userName = userName;  
	}  
	public String getUserPwd() {  
		return userPwd;  
	}  
	public void setUserPwd(String userPwd) {  
		this.userPwd = userPwd;  
	}  
	

	//测试
	public static void main( String[] args )
	{
		String IP = "192.168.8.10";
		String user = "ubuntu";
		String passwd  = "Test1234";
		RemoteExecuteCommand rec=new RemoteExecuteCommand(IP, user, passwd);  
        //执行命令  
        System.out.println(rec.execute("sh /home/ubuntu/graph/GenGraph/result/result_2019111216205/getSub2.sh"));
        
        //执行脚本  
//        System.out.println(rec.execute("sh /software/mark/GenGraph/result/Execute_Command.sh"));
        //这个方法与上面最大的区别就是，上面的方法，不管执行成功与否都返回，  
        //这个方法呢，如果命令或者脚本执行错误将返回空字符串  
//        rec.executeSuccess("ifconfig");  
	}
}
